// axios 基础的封装
import axios from 'axios'
import 'element-plus/theme-chalk/el-message.css'
import { ElMessage } from 'element-plus'
import { useUserStore } from '@/stores/userStore'
import { useRouter } from 'vue-router'

// 创建axios实例
const httpInstance = axios.create({
  baseURL: 'http://pcapi-xiaotuxian-front-devtest.itheima.net',
  timeout: 500000, // 请求超时时间 5000ms
})

// 拦截器

// axios请求拦截器
httpInstance.interceptors.request.use(config => {
  // 1. 从pinia获取token数据
  const userStore = useUserStore()
  // 2. 按照后端的要求拼接token数据
  // const user = JSON.parse(window.localStorage.getItem('user'))
  // const token = user.userInfo.token
  const token = userStore.userInfo.token
  // 3. 返回配置对象
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  // 4. 处理完之后一定要把config返回，否则请求就会失败
  return config
}, e => Promise.reject(e))

// axios响应式拦截器
httpInstance.interceptors.response.use(res => res.data, e => {
  // 统一处理错误
  // 超出2xx的状态码都会触发该函数
  // 对响应错误做点什么
  // 1. 网络错误
  // 2. 401错误
  // 3. 404错误
  // 4. 500错误
  if (!e.response) {
    ElMessage({
      type: 'warning',
      message: '网络错误，请稍后重试'
    })
    return new Promise(() => { })
  }
  // 401错误
  if (e.response.status === 401) {
    ElMessage({
      type: 'warning',
      message: 'token失效，请重新登录'
    })
    // 跳转到登录页
    // 清除本地存储中的用户信息
    const userStore = useUserStore()
    userStore.clearUserInfo()
    // 跳转登录页
    // window.location.href = '/login'
    const router = useRouter()
    router.push('/login')
    // return new Promise(() => { })
  }
  // 404错误
  if (e.response.status === 404) {
    ElMessage({
      type: 'warning',
      message: '请求资源不存在'
    })
    return new Promise(() => { })
  }
  // 500错误
  if (e.response.status === 500) {
    ElMessage({
      type: 'warning',
      message: '服务器内部错误，请稍后重试'
    })
    return new Promise(() => { })
  }
  // 其他错误
  ElMessage({
    type: 'warning',
    message: e.response.data.message || '未知错误'
  })
  // 统一返回失败的promise对象，中断promise链
  return Promise.reject(e)
})

export default httpInstance
